 /*******************************************************************************
  * Copyright (c) 2000, 2006 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
 package org.eclipse.ui.internal.themes;

 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.StringConverter;
 import org.eclipse.swt.graphics.FontData;
 import org.eclipse.ui.internal.Workbench;

 /**
  * The FontDefiniton is the representation of the fontDefinition
  * from the plugin.xml of a type.
  */
 public class FontDefinition implements IHierarchalThemeElementDefinition,
         ICategorizedThemeElementDefinition, IEditable {

     private String label;

     private String id;

     private String defaultsTo;

     private String categoryId;

     private String description;

     private String value;

     private boolean isEditable;

     private FontData[] parsedValue;

     /**
      * Create a new instance of the receiver.
      *
      * @param fontName The name display
      * ed in the preference page.
      * @param uniqueId The id used to refer to this definition.
      * @param defaultsId The id of the font this defaults to.
      * @param fontDescription The description of the font in the preference page.
      */
     public FontDefinition(String fontName, String uniqueId, String defaultsId,
             String value, String categoryId, boolean isEditable,
             String fontDescription) {
         this.label = fontName;
         this.id = uniqueId;
         this.defaultsTo = defaultsId;
         this.value = value;
         this.categoryId = categoryId;
         this.description = fontDescription;
         this.isEditable = isEditable;
     }

     /**
      * Create a new instance of the receiver.
      *
      * @param originalFont the original definition. This will be used to populate
      * all fields except defaultsTo and value. defaultsTo will always be
      * <code>null</code>.
      * @param datas the FontData[] value
      */
     public FontDefinition(FontDefinition originalFont, FontData[] datas) {
         this.label = originalFont.getName();
         this.id = originalFont.getId();
         this.categoryId = originalFont.getCategoryId();
         this.description = originalFont.getDescription();
         this.isEditable = originalFont.isEditable();
         this.parsedValue = datas;
     }

     /**
      * Returns the defaultsTo. This is the id of the text font
      * that this font defualts to.
      * @return String or <pre>null</pre>.
      */
     public String getDefaultsTo() {
         return defaultsTo;
     }

     /**
      * Returns the description.
      * @return String or <pre>null</pre>.
      */
     public String getDescription() {
         return description;
     }

     /**
      * Returns the label.
      * @return String
      */
     public String getName() {
         return label;
     }

     /**
      * Returns the id.
      * @return String
      */
     public String getId() {
         return id;
     }

     /**
      * Returns the categoryId.
      * @return String
      */
     public String getCategoryId() {
         return categoryId;
     }

     /**
      * Returns the value.
      *
      * @return FontData []
      */
     public FontData[] getValue() {
         if (value == null) {
             return null;
         }
         if (parsedValue == null) {
             parsedValue = JFaceResources.getFontRegistry().filterData(
                     StringConverter.asFontDataArray(value),
                     Workbench.getInstance().getDisplay());
         }

         return parsedValue;
     }

     /* (non-Javadoc)
      * @see org.eclipse.ui.internal.themes.IEditable#isEditable()
      */
     public boolean isEditable() {
         return isEditable;
     }
     
     /* (non-Javadoc)
      * @see java.lang.Object#equals(java.lang.Object)
      */
     public boolean equals(Object obj) {
         if (obj instanceof FontDefinition) {
             return getId().equals(((FontDefinition)obj).getId());
         }
         return false;
     }
     
     /* (non-Javadoc)
      * @see java.lang.Object#hashCode()
      */
     public int hashCode() {
         return id.hashCode();
     }
 }

